#ifndef __MVS_ELICENSE_h__
#define __MVS_ELICENSE_h__

#include "mvdef.h"

typedef enum _elic_status
{
    MVS_ELIC_INVALID     = 0, ///< 无有效授权
    MVS_ELIC_EXISTS      = 1, ///< 已存在授权
    MVS_ELIC_NEW         = 2, ///< 获得新授权
}mvs_elic_status_e;

typedef struct _elic_hdl
{
    /** 传入参数 */
    mv_u32_t          u32_did;              ///< 请求授权did
	mv_v8_t           av8_model_name[32];   ///< 设备model名称
    mv_v8_t           av8_product_name[32]; ///< 设备产品/机型名称
    mv_v8ptr_t        pv8_token;            ///< 请求授权专用码
    mv_v8ptr_t        pv8_i2c_dev;          ///< 硬件存储方式下的I2C路径
    mv_v8ptr_t        pv8_elic_file;        ///< 文件存储方式下的存储路径
    struct {
        mv_v8ptr_t    pv8_data;             ///< license保护辅助数据
        mv_s32_t      s32_len;              ///< 辅助数据长度
    }stru_protection;
    /** 输出结果 */
    mvs_elic_status_e e_status;             ///< 输出当前授权状态
    mv_u32_t          u32_elic_ver;         ///< 加密授权版本(0:预烧录旧加密; else:新加密授权版本)
    mv_v8_t           av8_msg[256];         ///< 授权异常描述
}mvs_elic_hdl_t;

/**
 * @brief Elicense授权过程
 * 
 * @param phdl              [in] elic 授权句柄，保护启动入参部分和结果输出部分
 * @param s32_net_err_retry [in] 网络原因导致的失败时，重试次数
 * @return 授权过程结果
 * - success : MV_EC_SUCCESS
 * -  failed : MV_EC_ABORT           (异常，且必须中断)
 *             MV_EC_MALLOC_FAILED   (内存申请失败)
 *             MV_EC_NOT_MATCH       (某种校验失败)
 *             MV_EC_INVALID_ARGS    (非法参数)
 *             MV_EC_TIMEOUT         (授权网络通信超时)
 *             MV_EC_CONNECT_ERROR   (授权网络通信服务器连接失败)
 *             MV_EC_GET_HOST_FAILED (域名解析失败)
 *             MV_EC_SOCKET_ERROR    (socket通信异常)
 *             MV_EC_IO_ERROR        (IO异常)
 *             MV_EC_FAILED          (其他错误)
 * @note 内部已包含了Elicense内容检查
 */
mv_s32_t mvs_elic_process(mvs_elic_hdl_t *phdl, mv_s32_t s32_net_err_retry);

/**
 * @brief Elicense内容检查，专供给仅需要检查而非自动授权的应用场景
 * 
 * @param phdl     [in] elic 授权句柄，保护启动入参部分和结果输出部分
 * @param pu32_did [out](可选)取出已存在的DID
 * @param pu32_pid [out](可选)取出已存在的PID
 * @return 检查结果
 * - success : MV_EC_SUCCESS
 * -  failed : MV_EC_ABORT           (异常，且必须中断)
 *             MV_EC_MALLOC_FAILED   (内存申请失败)
 *             MV_EC_NOT_MATCH       (某种校验失败)
 *             MV_EC_IO_ERROR        (IO异常)
 *             MV_EC_FAILED          (其他错误)
 */
mv_s32_t mvs_elic_check(mvs_elic_hdl_t *phdl, mv_u32ptr_t pu32_did, mv_u32ptr_t pu32_pid);

/** 清除授权信息，慎用！ */

/**
 * @brief 清除授权信息
 * 
 * @param pv8_i2c_dev   [in] 硬件存储方式下的I2C路径
 * @param pv8_elic_file [in] 文件存储方式下的存储路径
 * @return 操作结果
 * - success : MV_EC_SUCCESS
 * -  failed : else
 * @attention 谨慎使用！！！
 */
mv_s32_t mvs_elic_erase(mv_v8ptr_t pv8_i2c_dev, mv_v8ptr_t pv8_elic_file);

/**********************************
 *         PortingAPIs
 *********************************/
/**
 * @brief 打开I2C设备
 * 
 * @param pv8_i2c_dev [in] I2C设备节点
 * @param u8_i2c_addr [in] 器件地址(已去掉末尾读写位)
 * @return 操作结果
 * - success : I2C操作句柄
 * -  failed : else (<0)
 */
mv_s32_t mvspt_i2c_open (mv_v8ptr_t pv8_i2c_dev, mv_u8_t u8_i2c_addr);
/**
 * @brief I2C写操作
 * 
 * @param fd_i2c        [in] I2C操作句柄
 * @param pu8_sub_addr  [in] 起始地址
 * @param u8_addr_width [in] 地址长度
 * @param cpu8_databuf  [in] 写入数据
 * @param u8_data_len   [in] 数据长度
 * @return 操作结果
 * - success : MV_EC_SUCCESS
 * -  failed : else
 */
mv_s32_t mvspt_i2c_write(mv_s32_t fd_i2c, mv_u8ptr_t pu8_sub_addr, mv_u8_t u8_addr_width, mv_cu8ptr_t cpu8_databuf, mv_u8_t u8_data_len);
/**
 * @brief I2C读操作
 * 
 * @param fd_i2c        [in] I2C操作句柄
 * @param pu8_sub_addr  [in] 起始地址
 * @param u8_addr_width [in] 地址长度
 * @param pu8_databuf   [out] 读出数据缓冲区
 * @param u8_data_len   [in] 需读出数据长度
 * @return 操作结果
 * - success : MV_EC_SUCCESS
 * -  failed : else
 */
mv_s32_t mvspt_i2c_read (mv_s32_t fd_i2c, mv_u8ptr_t pu8_sub_addr, mv_u8_t u8_addr_width, mv_u8ptr_t   pu8_databuf, mv_u8_t u8_data_len);
/**
 * @brief 关闭I2C设备(释放句柄)
 * 
 * @param fd_i2c        [in] I2C操作句柄
 * @return 操作结果
 * - success : MV_EC_SUCCESS
 * -  failed : else
 */
mv_s32_t mvspt_i2c_close(mv_s32_t fd_i2c);

#endif
